package Thread;

import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

public class Demo7 {
//    编写代码, 实现多线程数组求和.
//    给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
//    实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
//    其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
//    最终再汇总两个和, 进行相加
//    记录程序的执行时间.

    public static void main(String[] args) throws InterruptedException {
        int arrayLength = 10000 ;
        int[] array = new int[arrayLength];

        //随机数填充数组
        Random random = new Random();
        for (int i = 0; i < arrayLength; i++) {
            array[i] = random.nextInt(100)+1;
        }

        //AtomicLong是一种多线程安全的长整型变量
        AtomicLong sumEven = new AtomicLong();
        AtomicLong sumOdd = new AtomicLong();

        //创建线程
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < arrayLength; i += 2) {
                sumEven.addAndGet(array[i]);
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 1; i < arrayLength; i += 2) {
                sumOdd.addAndGet(array[i]);
            }
        });

        //开始记录时间
        long startTime = System.currentTimeMillis();

        //启动线程
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        //记录结束时间并计算
        long endTime = System.currentTimeMillis();
        long timeAll = endTime - startTime;
        long totalSum = sumEven.get() + sumOdd.get();
        System.out.println("线程1下标元素的和: " + sumEven);
        System.out.println("线程2下标元素的和: " + sumOdd);
        System.out.println("所有元素的总和: " + totalSum);
        System.out.println("程序执行时间: " + timeAll + " 毫秒");
    }
}
